北京大学暑期课程实验部分编程基础内容介绍

Author:Hongyu Xiao

Graduate Student
University of Illinois at Urbana–Champaign
August, 2020

Modified based on https://github.com/inducer/languages-and-codegen-tutorial
and http://c.biancheng.net/view/2010.html


如果有遇到问题的话

请联系我!

邮箱是:hongyu.xiao@hotmail.com

标题开头为: PEK_Summer_Question

例如 PEK_Summer_Question anaconda无法下载


Numpy 部分学习预期

* 学会导入numpy模块并且创建Numpy array

* 了解Numpy array的shape和dtype

* 了解Numpy array的indexing/slicing/filtering

* 了解Numpy array的潜在风险


numpy: 简介

导入numpy模块

In [1]:
import numpy as np
In [2]:
n = 10  # CHANGE ME
List_Example_1 = list(range(n))
List_Example_2 = np.arange(n)

if n <= 10:
    print(List_Example_1)
    print(List_Example_2)
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
[0 1 2 3 4 5 6 7 8 9]
In [4]:
%timeit [i**2 for i in List_Example_1]
2.13 µs ± 11 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
In [6]:
%timeit List_Example_2**2
597 ns ± 3.38 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)

Numpy Arrays: 少了很多的灵活性,但是有很大优点

  • 内存占用少
  • 跑起来更快

创建一个numpy array:

  • 从list创建
In [7]:
#clear
np.array([1,2,3])
Out[7]:
array([1, 2, 3])
  • linspace 创建
In [8]:
#clear
np.linspace(-1, 1, 10)
Out[8]:
array([-1.        , -0.77777778, -0.55555556, -0.33333333, -0.11111111,
        0.11111111,  0.33333333,  0.55555556,  0.77777778,  1.        ])
  • zeros创建
In [9]:
#clear
np.zeros((10,10), np.float64)
Out[9]:
array([[0., 0., 0., 0., 0., 0., 0., 0., 0., 0.],
       [0., 0., 0., 0., 0., 0., 0., 0., 0., 0.],
       [0., 0., 0., 0., 0., 0., 0., 0., 0., 0.],
       [0., 0., 0., 0., 0., 0., 0., 0., 0., 0.],
       [0., 0., 0., 0., 0., 0., 0., 0., 0., 0.],
       [0., 0., 0., 0., 0., 0., 0., 0., 0., 0.],
       [0., 0., 0., 0., 0., 0., 0., 0., 0., 0.],
       [0., 0., 0., 0., 0., 0., 0., 0., 0., 0.],
       [0., 0., 0., 0., 0., 0., 0., 0., 0., 0.],
       [0., 0., 0., 0., 0., 0., 0., 0., 0., 0.]])

对于numpy array的运算,都是元素间点对点的进行的

In [10]:
List_Example_3 = np.array([1.2, 3, 4])
List_Example_4 = np.array([0.5, 0, 1])
In [11]:
#clear
List_Example_3 + List_Example_4
Out[11]:
array([1.7, 3. , 5. ])
In [12]:
#clear
List_Example_3 * List_Example_4
Out[12]:
array([0.6, 0. , 4. ])
In [13]:
#clear
List_Example_3 ** List_Example_4
Out[13]:
array([1.09544512, 1.        , 4.        ])

对于矩阵乘法 使用 np.dot(A, B) 进行实现


对于numpy的array,有两个最重要的attributes

  • .shape 返回的是array的维度,用tuple类型显示

  • .dtype 返回的是type

In [14]:
List_Example_5 = np.random.rand(5, 4, 3)
List_Example_5.shape
Out[14]:
(5, 4, 3)
In [15]:
List_Example_5.dtype
Out[15]:
dtype('float64')

numpy: Indexing

In [16]:
import numpy as np
In [17]:
List_Example_6 = np.random.rand(3,4,5)
List_Example_6.shape
Out[17]:
(3, 4, 5)
In [19]:
List_Example_6[0].shape
Out[19]:
(4, 5)
In [20]:
List_Example_6[...,2].shape
Out[20]:
(3, 4)
In [21]:
List_Example_6[1,0,3]
Out[21]:
0.940100629240245

Python中的index都是从0开始的!!

Python中的index都是从0开始的!!

Python中的index都是从0开始的!!


例如:

In [22]:
List_Example_6[3,2,2].shape
---------------------------------------------------------------------------
IndexError                                Traceback (most recent call last)
<ipython-input-22-6b182104b76f> in <module>
----> 1 List_Example_6[3,2,2].shape

IndexError: index 3 is out of bounds for axis 0 with size 3
In [23]:
List_Example_6[:,2].shape
Out[23]:
(3, 5)

对于array中进行操作的话:

In [1]:
List_Example_7 = np.zeros((4,4))
List_Example_7
Out[1]:
array([[0., 0., 0., 0.],
       [0., 0., 0., 0.],
       [0., 0., 0., 0.],
       [0., 0., 0., 0.]])

生成一个叫做LE7Sub 的 $2\times 2$ 矩阵

In [2]:
#clear
List_Example_7_Sub = List_Example_7[:2,:2]

List_Example_7_Sub
Out[2]:
array([[0., 0.],
       [0., 0.]])

如我们之前所标注一样,如果修改List_Example_7_Sub的话...

In [3]:
#clear
List_Example_7_Sub[1,0] = 5

List_Example_7_Sub
Out[3]:
array([[0., 0.],
       [5., 0.]])
In [4]:
print(List_Example_7)
[[0. 0. 0. 0.]
 [5. 0. 0. 0.]
 [0. 0. 0. 0.]
 [0. 0. 0. 0.]]

原来的array也会被修改

我们一般使用.copy()来进行脱钩

In [28]:
List_Example_7_Sub = List_Example_7_Sub.copy()
List_Example_7_Sub[1,1] = 7
print(List_Example_7)
[[0. 0. 0. 0.]
 [5. 0. 0. 0.]
 [0. 0. 0. 0.]
 [0. 0. 0. 0.]]

这样就不会对原来的array产生印象啦~!

除此以外,还可以用array作为array的index

In [30]:
List_Example_8 = np.random.rand(4,4)
List_Example_8
Out[30]:
array([[0.14662543, 0.91282487, 0.64009221, 0.38303388],
       [0.44170791, 0.81078178, 0.40108153, 0.07345852],
       [0.90636908, 0.02897211, 0.39018874, 0.46509716],
       [0.15090354, 0.91336054, 0.96226126, 0.44219043]])
In [31]:
#clear
i = np.array([0,2])

List_Example_8[i]
Out[31]:
array([[0.14662543, 0.91282487, 0.64009221, 0.38303388],
       [0.90636908, 0.02897211, 0.39018874, 0.46509716]])

还可以进行array条件筛选

In [32]:
List_Example_8>0.5
Out[32]:
array([[False,  True,  True, False],
       [False,  True, False, False],
       [ True, False, False, False],
       [False,  True,  True, False]])
In [33]:
#clear
List_Example_8[List_Example_8>0.5]
Out[33]:
array([0.91282487, 0.64009221, 0.81078178, 0.90636908, 0.91336054,
       0.96226126])

numpy: Tools

常用的结合工具有

  • scipy
  • matplotlib
In [34]:
import numpy as np
import matplotlib.pyplot as pt
In [35]:
x = np.linspace(-10, 10, 100)
pt.plot(x, np.sin(x)+x*0.5)
Out[35]:
[<matplotlib.lines.Line2D at 0x1d9a9996940>]
In [36]:
pic = np.sin(x).reshape(len(x), 1)  * np.cos(x)
pt.imshow(pic)
Out[36]:
<matplotlib.image.AxesImage at 0x1d9a9a4f280>